package com.heima.activiti;

import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @Auth: zhuan
 * @Desc: Activiti第三步：流程任务处理
 * @Date: 2022-03-25 18:50:37
 */
@SpringBootTest(classes = SpringbootActivity7Application.class)
@RunWith(SpringRunner.class)
public class ActivitiTaskTest003 {
		/**
		 * TaskService: Activiti的任务管理接口，可以从这个接口中获取任务的信息
		 */
		@Autowired
		private TaskService taskService;

		/**
		 * 功能描述: 查询所有的任务
		 * @return : void
		 */
		@Test
		public void getTasks(){
				List<Task> list = taskService.createTaskQuery().list();
				for(Task tk : list){
						System.out.println("Id："+tk.getId());
						System.out.println("Name："+tk.getName());
						System.out.println("Assignee："+tk.getAssignee());
				}
		}

		/**
		 * 功能描述: 查询属于我的流程任务---相当于一个人查看自己的【请假申请单】
		 * 【请假申请流程.bpmn】具体流程：
		 * 		【开始】-->【填写请假申请单（heima）】-->【部门经理审批（admin）】-->【总经理审批（root）】-->【结束】
		 * 	第一步：流程实例创建后，相当于执行了【开始流程】，所以创建“流程实例”后，可以根据Assignee名称-“heima”查询到任务
		 * @return : void
		 */
		@Test
		public void getTasksByAssignee(){
				List<Task> list = taskService.createTaskQuery()
																	.taskAssignee("heima")
																	.list();
				for(Task tk : list){
						System.out.println("Id："+tk.getId());
						System.out.println("Name："+tk.getName());
						System.out.println("Assignee："+tk.getAssignee());
				}

		}
		/**
		 * 功能描述: 执行任务
		 * 第二步：Assignee委托人（代理人）"heima"执行了自己的任务（任务ID可以根据Assignee“heima”进行查询），则会执行到下一个环节【部门经理审批（admin）】
		 * 第三步：Assignee委托人（代理人）"admin"执行了自己的任务（任务ID可以根据Assignee“admin”进行查询），则会执行到下一个环节【总经理审批（root）】
		 * 第四步：Assignee委托人（代理人）"root"执行了自己的任务（任务ID可以根据Assignee“root”进行查询），则会执行到下一个环节【结束】
		 * @return : void
		 */
		@Test
		public void completeTask(){
				taskService.complete("1f117878-ac37-11ec-abad-005056c00008");
				System.out.println("完成任务");

		}
		/**
		 * 功能描述: 丢弃、拾取任务
		 * 		unclaim丢弃任务：只需要指定taskId
		 * 	  claim拾取任务：需要指定taskId、userId，相当于某一用户接受了该任务
		 * @return : void
		 */
		@Test
		public void claimTask(){
				taskService.claim("91c58e60-ac2a-11ec-80fb-005056c00008","heima");
				//taskService.unclaim("91c58e60-ac2a-11ec-80fb-005056c00008");
		}

		/**
		 * 功能描述: 归还、交办
		 * 	setAssignee归还和交办都是调用该方法：
		 * 		参数一：任务ID-taskId
		 * 		参数二：用户ID-userId
		 * 			当userId为任务原委托人时相当于“归还”；
		 * 			当userId为非原委托人时相当于“交办”，交给其他人办理；
		 * 			当userId为null时，相当于unclaim丢弃任务
		 * @return : void
		 */
		@Test
		public void setTaskAssignee(){
				taskService.setAssignee("91c58e60-ac2a-11ec-80fb-005056c00008",null);//归还候选任务
				//taskService.setAssignee("91c58e60-ac2a-11ec-80fb-005056c00008","root");//交办
		}
}
